package top.xia17.plugins.fast.common.database.jpa.extension;

import jakarta.validation.constraints.NotNull;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;

import java.util.List;
import java.util.Optional;

/**
 * Jpa基础service
 *
 * @author xia17
 * @since 2021/7/14 11:37
 */
public interface JpaDtoService<T, D, ID> extends JpaService<T, ID> {

    /**
     * 通过ID查询
     *
     * @param id id
     * @return /
     */
    Optional<D> findDtoById(ID id);

    /**
     * 通过id查询 ，如果没有则抛出 EntityNotFoundException
     *
     * @param id id
     * @return /
     */
    D findDtoByIdOrThrow(ID id);

    /**
     * 查询所有
     *
     * @param query 查询条件可以为null
     * @return /
     */
    List<D> findAllDto(Specification<T> query);

    /**
     * 通过多个id查询
     *
     * @param ids ids
     * @return /
     */
    List<D> findAllDtoById(Iterable<ID> ids);

    /**
     * 查询分页
     *
     * @param query    查询条件，可以为null
     * @param pageable 分页条件
     * @return /
     */
    Page<D> findAllDto(Specification<T> query, Pageable pageable);

    /**
     * 查询一个
     *
     * @param query 查询条件，非空
     * @return /
     */
    Optional<D> findOneDto(@NotNull Specification<T> query);

    /**
     * 查询一个，如果没有找到则抛出 EntityNotFoundException
     *
     * @param query 查询条件，非空
     * @return /
     */
    D findOneDtoOrThrow(@NotNull Specification<T> query);

    /**
     * 新增一个实体
     *
     * @param resource 资源实体
     * @return 新增后的实体
     */
    D createDto(T resource);

    /**
     * 更新实体
     *
     * @param resource 资源实体
     * @return 更新后的实体
     */
    D updateDto(T resource);


}
